1 using System;
2 using System.Collections;
3 using System.Linq;
4 using UnityEngine;
5 using UnityEngine.UI;
6 using ThreeDPool.EventHandlers;
7 using ThreeDPool.Managers;
8
9 namespace ThreeDPool.UIControllers
10 {
11 public class GameUIScreen : MonoBehaviour
12 {
13 [SerializeField]
14 private GameObject _pausePageGo;
15
16 [SerializeField]
17 private VerticalLayoutGroup _playerGridGroup;
18
19 [SerializeField]
20 private GameObject _playerUITemplate;
21
22 [SerializeField]
23 private GameObject _loadingTextGo;
24
25 [SerializeField]
26 private GameObject _quitButtonGo;
27
28 [SerializeField]
29 private Text _gameComplete;
30
31 private void Start()
32 {
33 // subscribe
34 EventManager.Subscribe(typeof(GameInputEvent).Name, OnGameInput);
35 EventManager.Subscribe(typeof(ScoreUpdateEvent).Name, OnScoreUpdate);
36 EventManager.Subscribe(typeof(GameStateEvent).Name, OnPlayerTurnChanged);
37 }
38
39 private void OnDestroy()
40 {
41 // unsubscribe
42 EventManager.Unsubscribe(typeof(GameInputEvent).Name, OnGameInput);
43 EventManager.Unsubscribe(typeof(ScoreUpdateEvent).Name, OnScoreUpdate);
44 EventManager.Unsubscribe(typeof(GameStateEvent).Name, OnPlayerTurnChanged);
45 }
46
47 private void OnScoreUpdate(object sender, IGameEvent gameEvent)
48 {
49 try {
50 // since the score update is made by the player, the sender of this event should be the player
51 Player player = (Player)sender;
52
53 PlayerUIController[] playerUIControllers = _playerGridGroup.GetComponentsInChildren<PlayerUIController>();
54 if (playerUIControllers != null && playerUIControllers.Length > 0)
55 {
56 PlayerUIController playerUIController = playerUIControllers.FirstOrDefault(p => p.name.Equals(player.Name));
57 playerUIController.NameNScore.text = player.Name + " " + player.Score;
58 }
59 }
60 catch (Exception)
61 {
62
63 }
64 }
65
66 private void OnPlayerTurnChanged(object sender, IGameEvent gameEvent)
67 {
68 GameStateEvent gameStateEvent = (GameStateEvent)gameEvent;
69
70 if (gameStateEvent.GameState == GameStateEvent.State.Complete)
71 {
72 string winningText = string.Empty;
73
74 // not considering to show the draw message here, as everyone is a winner
75 if (GameManager.Instance.Winners.Length > 1)
76 {
77 winningText = "Game Complete, Winners are ";
78
79 foreach (var winner in GameManager.Instance.Winners)
80 winningText += winner + " ";
81 }
82 else
83 {
84 winningText = "Game Complete, Winner is " + GameManager.Instance.Winners[0];
85 }
86
87 GameManager.Instance.ChangeGameState(GameManager.GameState.Practise);
88
89 _gameComplete.text = winningText;
90
91 _pausePageGo.SetActive(true);
92 _quitButtonGo.SetActive(true);
93
94 StartCoroutine(ClearWinningMessage());
95 }
96 else {
97 string currPlayerName = gameStateEvent.CurrPlayer;
98 if (!string.IsNullOrEmpty(currPlayerName))
99 {
100 PlayerUIController[] playerUIControllers = _playerGridGroup.GetComponentsInChildren<PlayerUIController>();
101 if (playerUIControllers != null && playerUIControllers.Length > 0)
102 {
103 foreach (var playerUIController in playerUIControllers)
104 {
105 if (playerUIController.gameObject.name.Equals(currPlayerName))
106 playerUIController.TurnMarker.enabled = true;
107 else
108 playerUIController.TurnMarker.enabled = false;
109 }
110 }
111 }
112 }
113 }
114
115 private void OnGameInput(object sender, IGameEvent gameEvent)
116 {
117 GameInputEvent gameInputEvent = (GameInputEvent)gameEvent;
118 switch(gameInputEvent.State)
119 {
120 case GameInputEvent.States.Paused:
121 OnPause();
122 break;
123 }
124 }
125
126 private IEnumerator ClearWinningMessage()
127 {
128 yield return new WaitForSeconds(5);
129 _gameComplete.text = string.Empty;
130 }
131
132 private void OnPause()
133 {
134 _pausePageGo.SetActive(true);
135 _quitButtonGo.SetActive(true);
136 GameManager.Instance.OnPaused();
137 }
138
139 /// <summary>
140 /// this function is invoked by the Play Button in unity scene
141 /// </summary>
142 private void OnPlayPressed()
143 {
144 _pausePageGo.SetActive(false);
145
146 StartCoroutine(StartGame());
147 }
148
149 private void OnQuitPressed()
150 {
151 Application.Quit();
152 }
153
154 private IEnumerator StartGame()
155 {
156 // show loading text
157 _loadingTextGo.SetActive(true);
158
159 if (GameManager.Instance.CurrGameState == GameManager.GameState.Practise)
160 {
161 // give enough time for the ball, cue and camera to return back to its original position
162 EventManager.Notify(typeof(GameStateEvent).Name, this, new GameStateEvent() { GameState = GameStateEvent.State.Play });
163 }
164
165 GameManager.Instance.OnGetSet();
166 yield return new WaitForSeconds (3);
167
168 if (GameManager.Instance.PrevGameState == GameManager.GameState.Practise)
169 {
170 // reset score message
171 PlayerUIController[] playerUIControllers = _playerGridGroup.GetComponentsInChildren<PlayerUIController>();
172 if (playerUIControllers != null && playerUIControllers.Length > 0)
173 {
174 foreach (var playerUIController in playerUIControllers)
175 playerUIController.NameNScore.text = playerUIController.gameObject.name + " " + 0;
176 }
177
178 GameManager.Instance.OnPlay();
179
180 if (GameManager.Instance.NumOfTimesPlayed == 1)
181 {
182 // set first player as the one taking the turn
183 SetFirstPlayerToBreakShot();
184 }
185 }
186 else
187 {
188 GameManager.Instance.OnContinue();
189 }
190
191 // hide loading text
192 _loadingTextGo.SetActive(false);
193
194 // show the players
195 _playerGridGroup.gameObject.SetActive(true);
196 }
197
198 private void SetFirstPlayerToBreakShot()
199 {
200 PlayerUIController[] playerUIControllers = _playerGridGroup.GetComponentsInChildren<PlayerUIController>();
201 if (playerUIControllers != null && playerUIControllers.Length > 0)
202 playerUIControllers[0].TurnMarker.enabled = true;
203 }
204
205 public void CreatePlayerUI()
206 {
207 foreach(var player in GameManager.Instance.Players)
208 {
209 GameObject playerUIGo = Instantiate(_playerUITemplate);
210 playerUIGo.name = player.Name;
211 PlayerUIController playerUIController = playerUIGo.GetComponent<PlayerUIController>();
212 playerUIController.NameNScore.text = player.Name + " " + player.Score.ToString();
213 playerUIController.TurnMarker.enabled = false;
214 playerUIGo.transform.SetParent(_playerGridGroup.transform);
215 }
216 }
217 }
218 }